home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / pctjjl86.arc / RCINXOR.ASM < prev    next >
Assembly Source File  |  1986-04-16  |  4KB  |  128 lines

  1. ; *** Listing 7 ***
  2. ;
  3. ;Full row & column inline code XOR graphics driver for putting
  4. ; rectangular images into the Color/Graphics Adapter's
  5. ; medium-resolution memory map.
  6. ;
  7. ; Note: AX,BX,CX,DX,BP,SI,DI destroyed.
  8. ;
  9. one    segment para public 'CODE'
  10.     assume    cs:one,ds:one,es:nothing
  11.     public    form_driver
  12. ;
  13. form_driver proc near
  14.     mov    di,[bx+even_line_screen_offset_table]  ;find offset of
  15.                            ; top line of image
  16.     add    di,cx     ;ES:DI now points to byte at which to put
  17.              ; the image's upper left corner
  18.     lodsb         ;get the height of the image
  19.     xor    ah,ah     ;make height a word value for calculations
  20.     mov    bx,ax     ;store height in BX
  21.     lodsb         ;get the width of the image in bytes
  22.     mov    bp,2000h ;calculate the amount to add after even scan
  23.     sub    bp,ax     ; lines are drawn to get to the address of 
  24.              ; the next scan line
  25.     mov    dx,1fb0h ;calculate amount to subtract after odd scan
  26.     add    dx,ax     ; lines are drawn to get to the address of 
  27.              ; the next scan line
  28.     mov    cx,[bx+inline_height_vector_table-2] ;-2 because there 
  29.                     ; is no 0 lines entry point
  30.     mov    bx,ax     ;number of columns in image
  31.     shl    bx,1     ;convert into word table index
  32.     mov    ax,[bx+column_inline_vector_table-2]
  33.     xchg    ax,cx     ;CX now holds column code &, 
  34.              ; AX the row code address
  35.     jmp    ax     ;jmp to into inline code for height
  36. ;
  37. ;This table is used to find the offset of an even scan line in
  38. ; the memory map of the color graphics adapter in medium res mode.
  39. ;
  40. even_line_screen_offset_table label word
  41. x=0
  42.     rept    100    ;there are 100 even lines
  43.     dw    x*50h    ; each is 50h (80 decimal) long
  44. x=x+1
  45.     endm
  46. ;
  47. ;This is inline code for finding the screen address for each line
  48. ; of the image and calling the exclusive-ORing inline code.
  49. ;
  50. label    macro    x    ;this macro is used to label the inline code
  51. line&x&:        ; entry points
  52.     endm
  53. ;
  54. ;
  55. ; inline code for rows
  56. ;
  57. x=42            ;there will be an entry point for each even
  58.             ; number of lines between 2 and 40. They will
  59.             ; be labeled "line2", "line4", ... "line40"
  60.     rept    20    ;each repeat handles 2 lines; 1 even, 1 odd
  61. x=x-2            ;calculate no. of lines for this entry point
  62.     label    %x    ;put in label for entry point
  63.  
  64.     call    cx    ;CX holds address of inline columns code
  65.     add    di,bp    ;calculate address to start next line of image
  66.     call    cx    ;process image for odd scan line
  67.     sub    di,dx    ;calculate address to start next line of image
  68.     endm        ; the next line will be an even line
  69.     ret
  70. ;
  71. ;Inline code for XORing a line of the image into the screen
  72. ;
  73. clabel     macro     x    ;this macro is used to label the inline code
  74. cline&x&:        ; entry points for number of columns to XOR
  75.     endm        ;
  76. ;
  77. x=10            ;this code can handle an image up to ten bytes
  78.     rept    10    ; wide
  79.     clabel    %x    ;put in label for entry based on no. of bytes
  80.             ; in a column
  81.     lodsb        ;get the next byte from the object's image
  82.     xor    es:[di],al ; and XOR it with the value now at the 
  83.                ; screen position.
  84.     inc    di       ;point to next image byte in object's form
  85. x=x-1               ;adjust label number
  86.     endm
  87.     ret           ;this return is executed at the end of 
  88.                ; every line
  89. ;
  90. ;This table is used as an indirect address for jumping into
  91. ; the inline code for image moving.
  92. ;
  93. inline_height_vector_table label word    ;there is no entry point for 0
  94.                     ; lines. Starting at 2 
  95.                     ; eliminates the need to store
  96.                     ; a dummy entry point address
  97. entry_address    macro    x         ;this macro is used to generate
  98.         dw    line&x&      ; the labels corresponding to the
  99.         endm             ; inline code entry points
  100. ;
  101. x=2
  102.     rept    20
  103.     entry_address    %x
  104. x=x+2
  105.     endm
  106. ;
  107. ;This table is used as an indirect address for jumping into
  108. ; the inline code for exclusive-ORing columns.
  109. ;
  110. column_inline_vector_table label word     ;there is no entry point for 
  111.                      ; 0 lines. Starting at 2 
  112.                      ; eliminates a need to store 
  113.                      ; a dummy entry point address
  114. column_entry_address   macro   x     ;this macro is used to generate
  115.          dw     cline&x&    ; the labels corresponding to the
  116.          endm             ; inline code entry points
  117. ;
  118. x=1
  119.     rept    10
  120.     column_entry_address   %x
  121. x=x+1
  122.     endm
  123. ;
  124. ;
  125. form_driver endp
  126. one    ends
  127.     end
  128.